isf 0.1.0

Parsing, Deserialization and Serialization of the Interactive Shader Format.
Documentation
/*{
	"CREDIT": "by Carter Rosenberg",
	"ISFVSN": "2",
	"CATEGORIES": [
		"Color"
	],
	"INPUTS": [
		{
			"NAME": "offset",
			"TYPE": "float",
			"DEFAULT": 0.5
		},
		{
			"NAME": "frequency",
			"TYPE": "float",
			"MAX": 16.0,
			"MIN": 1.0,
			"DEFAULT": 1.0
		},
		{
			"NAME": "curve",
			"TYPE": "long",
			"VALUES": [
				0,
				1,
				2
			],
			"LABELS": [
				"Linear",
				"Sine",
				"Exponential"
			],
			"DEFAULT": 0
		},
		{
			"NAME": "vertical",
			"TYPE": "bool",
			"DEFAULT": 0.0
		},
		{
			"NAME": "startColor",
			"TYPE": "color",
			"DEFAULT": [
				1.0,
				0.75,
				0.0,
				1.0
			]
		},
		{
			"NAME": "endColor",
			"TYPE": "color",
			"DEFAULT": [
				0.0,
				0.25,
				0.75,
				1.0
			]
		}
	]
}*/



const float pi = 3.14159265359;
const float e = 2.71828182846;



void main() {
	float mixAmount = 0.0;
	float phase = offset;
	
	if (vertical)	{
		mixAmount = phase + frequency * isf_FragNormCoord[1];
	}
	else	{
		mixAmount = phase + frequency * isf_FragNormCoord[0];
	}
	
	if (curve == 0)	{
		mixAmount = mod(2.0 * mixAmount,2.0);
		mixAmount = (mixAmount < 1.0) ? mixAmount : 1.0 - (mixAmount - floor(mixAmount));
	}
	else if (curve == 1)	{
		mixAmount = sin(mixAmount * pi * 2.0 - pi / 2.0) * 0.5 + 0.5;
	}
	else if (curve == 2)	{
		mixAmount = mod(2.0 * mixAmount, 2.0);
		mixAmount = (mixAmount < 1.0) ? mixAmount : 1.0 - (mixAmount - floor(mixAmount));
		mixAmount = pow(mixAmount, 2.0);
	}
	
	gl_FragColor = mix(startColor,endColor,mixAmount);
}